package edu.amm.fanal.api;

import edu.amm.api.Bounds;

/**
 * Краевая задача для обыкновенного дифференциального уравнения.
 * 
 * @author Иванов Илья
 * @since 2013-05-10
 *
 */
public abstract class BoundaryProblem extends Bounds {
	
	private double leftValue;
	private double rightValue;
	private Function solution;
	
	/**
	 * @param leftBound Левая граница задачи.
	 * @param leftValue Значение решения на левой границе.
	 * @param rightBound Правая граница задачи.
	 * @param rightValue Значение решения на правой границе.
	 * @param nodesConfig Кофигурация узлов сетки, на которой будет построено решение.
	 */
	public BoundaryProblem(double leftBound, double leftValue, double rightBound, double rightValue) {
		super(leftBound, rightBound);
		
		this.leftValue = leftValue;
		this.rightValue = rightValue;
	}
	
	/**
	 * @return Значение решения на левой границе.
	 */
	public double getLeftValue() {
		return leftValue;
	}
	
	/**
	 * @return Значение решения на правой границе.
	 */
	public double getRightValue() {
		return rightValue;
	}
	
	/**
	 * @param solution Решение задачи.
	 */
	public void setSolution(Function solution) {
		if (solution == null)
			return;
		if (solution.getDim() != SOLUTION_DIM)
			throw new RuntimeException("Решением задачи должна быть функция одной переменной");
		
		this.solution = solution;
	}
	
	/**
	 * @return Решение задачи (опционально, если оно заранее известно).
	 */
	public Function getSolution() {
		return solution;
	}
	
	/** Число переменных, от которых зависит решение задачи. */
	public static final int SOLUTION_DIM = 1;
}